package com.ry.aop.myaop.advicechain;


import java.lang.reflect.Method;
import java.util.List;

/**
 * 通知调用链
 */
public class Chain {


    private List<BaseAdvice> adviceList;

    // 记录一下index下标
    private int index = -1;

    // 目标方法 UserService.insert()
    private Method method;
    // 目标方法参数
    private Object[] args;
    // 目标类对象
    private Object target;

    public Chain(List<BaseAdvice> adviceList){
        this.adviceList = adviceList;
    }

    public Chain(List<BaseAdvice> adviceList, Method method, Object[] args, Object target) {
        this.adviceList = adviceList;
        this.method = method;
        this.args = args;
        this.target = target;
    }

    // 遍历List,执行我们的通知方法
    public Object proceed() throws Throwable {

        // 递归调用，结束条件？
        if (index == adviceList.size() - 1){

            // index = -1,adviceList.size = 1
            // -1 == 1-1=0
            // 0  == 1-1=0 满足if，返回到before

            // System.out.println("===执行目标方法 未完成===");
            // 通过反射调用目标方法


            // 所有的通知都依次调用完成，才会进入这个if
            return method.invoke(target,args);
        }


        return adviceList.get(++index).execute(this);
    }

}
